home *** CD-ROM | disk | FTP | other *** search
-
- Program StarryNight;
-
- { Looks like some late evening in the summer before starry night }
- { But i guess that stars goes brighter much faster than dimmer }
- { Can you advise me on that fenomenon? }
-
- Const
- NumberOfStars = 55; { Number of Stars. Can't be greater than 55 }
- type
- StarMapArray = Array [0..6,0..4] of Word;
- { Each star allocate rectangle 4 pixels width and 6 pixels height }
- const
- StarMap : StarMapArray =
- ((0,0,1,0,0),
- (0,0,2,0,0),
- (0,0,3,0,0),
- (1,3,4,3,1),
- (0,0,3,0,0),
- (0,0,2,0,0),
- (0,0,1,0,0));
- { This is picture of one star }
- Type
-
- RGBRec = Record
- r,g,b: byte;
- end;
- { Palette record }
-
- PStar = ^TStar; { Star itself }
- TStar = object
- Delta: byte; { Step for brightness change }
- Brightest: RGBRec; { The very brightest color of the star }
- Brighten: Boolean; { Do star go brighter? }
- Number: byte; { Personal star number }
- Xloc,Yloc: word; { X,Y location }
- Colors: Array [1..4] of RGBRec; { Star colors }
- constructor Init(ANumber: Byte);
- procedure Relocate; { Move star to new position }
- procedure Rotate; { Change colors step by step }
- end;
-
- {..$DEFINE Mono}
- { Define MONO if you whant to see gray-scaled stars }
-
- function keypressed : boolean; assembler;
- asm
- Mov AH,01h
- Int 16h
- JNZ @0
- XOR AX,AX
- Jmp @1
- @0: Mov AL,1
- @1:
- end;
-
- constructor TStar.Init(ANumber: Byte);
- var
- cx,cy: word;
- begin
- Number:=ANumber;
- XLoc:=0;YLoc:=0;
- Relocate;
- end;
-
- procedure TStar.Relocate;
- var
- cx,cy: word;
- cc: byte;
- {$IFDEF Mono}
- mc: byte;
- {$ENDIF}
- begin
- For cy:=0 to 6 do
- For cx:=0 to 4 do
- Mem[$A000:(cx+XLoc)+(cy+Yloc)*320]:=(224+(cy+YLoc) div 8);
- { Restore old background }
- Brighten:=True;
- {$IFDEF Mono}
- mc:=Random(64);
- With Brightest do
- begin
- r:=mc;
- g:=mc;
- b:=mc;
- end;
- {$ELSE}
- With Brightest do
- begin
- r:=Random(64);
- g:=Random(64);
- b:=Random(64);
- end;
- {$ENDIF}
- Port[968]:=Number*4;
- For cc:=1 to 4 do
- begin
- with Colors[cc] do
- begin
- r:=0; g:=0; b:=0;
- end;
- Port[969]:=0;
- Port[969]:=0;
- Port[969]:=0;
- end;
- XLoc:=Random(320-5);
- YLoc:=Random(200-7);
- Delta:=Random(5)+1;
- { Delta:=(YLoc Div 40)+1;}
- { Stars near horizont blink rapidly }
- For cx:=0 to 4 do
- For cy:=0 to 6 do
- if StarMap[cy,cx]<>0
- then
- Mem[$A000:(cx+XLoc)+(cy+Yloc)*320]:=
- StarMap[cy,cx]+(Number ShL 2)-1;
- { Put star to screen }
- end;
-
- procedure TStar.Rotate;
- var
- cc: byte;
- cx,cy: word;
- begin
- If Brighten
- then
- begin
- For cc:=1 to 4 do
- begin
- If Colors[5-cc].r+Delta<=Brightest.r div cc
- then
- Inc(Colors[5-cc].r,Delta)
- else
- Colors[5-cc].r:=Brightest.r div cc;
- If Colors[5-cc].g+Delta<=Brightest.g div cc
- then
- Inc(Colors[5-cc].g,Delta)
- else
- Colors[5-cc].g:=Brightest.g div cc;
- If Colors[5-cc].b+Delta<=Brightest.b div cc
- then
- Inc(Colors[5-cc].b,Delta)
- else
- Colors[5-cc].b:=Brightest.b div cc;
- end;
- if (Colors[4].r=Brightest.r) and
- (Colors[4].g=Brightest.g) and
- (Colors[4].b=Brightest.b)
- then
- Brighten:=False
- end
- else
- begin
- For cc:=1 to 4 do
- begin
- If Colors[cc].r>=Delta
- then
- Dec(Colors[cc].r,Delta)
- else
- Colors[cc].r:=0;
- If Colors[cc].g>=Delta
- then
- Dec(Colors[cc].g,Delta)
- else
- Colors[cc].g:=0;
- If Colors[cc].b>=Delta
- then
- Dec(Colors[cc].b,Delta)
- else
- Colors[cc].b:=0;
- end;
- if (Colors[4].r=0) and (Colors[4].g=0) and (Colors[4].b=0)
- then
- Relocate;
- end;
- Port[968]:=Number*4;
- For cc:=1 to 4 do
- begin
- Port[969]:=Colors[cc].r;
- Port[969]:=Colors[cc].g;
- Port[969]:=Colors[cc].b;
- end;
- end;
-
- var
- StarArray: Array [1..NumberOfStars] of PStar;
- sc: byte;
- c: char;
- ccx,ccy: word;
-
- begin
- asm mov ax,13h; int 10h end;
- port[968]:=224;
- for ccx:=1 to 255-224 do
- begin
- port[969]:=ccx div 2;
- port[969]:=0;
- port[969]:=ccx;
- end;
- For ccx:=0 to 319 do
- For ccy:=0 to 199 do
- Mem[$A000:(ccx+ccy*320)]:=(224+ccy div 8);
- { This make a background or backsky as you like }
-
- for sc:=1 to NumberOfStars do
- begin
- StarArray[sc]:=New(PStar,Init(sc));
- end;
- sc:=1;
- repeat
- StarArray[sc]^.Rotate;
- If sc=NumberOfStars
- then
- sc:=1
- else
- Inc(sc);
- until keypressed;
- end.